home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / vbcc / machines / amiga68k / libsrc / stdio / old / vfscanf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-06-24  |  4.1 KB  |  118 lines

  1. #include <stdio.h>
  2. #include <limits.h>
  3. #include <stdarg.h>
  4.  
  5. int _killsp(FILE *f)
  6. /*  ueberspringt Leerzeichen    */
  7. {
  8.     int k,n=0;
  9.     do{
  10.         k=getc(f);n++;
  11.     }while(isspace(k));
  12.     ungetc(k,f);
  13.     return(--n);
  14. }
  15.  
  16. int _vfscanf(FILE *in,const char *fmt,va_list vl)
  17. {
  18.     int k,n=0;
  19.     while(k=*fmt){
  20.         _killsp(in);
  21.         if(k=='%'){
  22.             int max,flags=0,i,*ip,base=0,c;
  23.             char *str;unsigned int val,s=0;
  24.             long *lp;short *sp;
  25.             k=*++fmt;
  26.             if(k>='0'&&k<='9'){
  27.                 max=0;
  28.                 while(k>='0'&&k<='9'){
  29.                     max=max*10+k-'0';
  30.                     k=*++fmt;
  31.                 }
  32.             }else max=INT_MAX;
  33.             if(k=='h'){flags|=2;k=*++fmt;}
  34.             if(k=='l'||k=='L'){flags|=4;k=*++fmt;}
  35.             fmt++;
  36.             switch(k){
  37.                 default:
  38.                 case '%':
  39.                             c=getc(in);
  40.                             if(c!=k) {ungetc(c,in);return(n);}
  41.                             break;
  42.                 case 'c':
  43.                             str=va_arg(vl,char *);
  44.                             if((c=getc(in))==EOF) return(n);
  45.                             n++; *str=c;
  46.                             break;
  47.                 case 's':
  48.                             str=va_arg(vl,char *);
  49.                             i=0;
  50.                             do{
  51.                                 c=getc(in);i++;
  52.                                 *str++=c;
  53.                             }while(i<max&&!isspace(c)&&c!=EOF&&c!=0);
  54.                             if(isspace(c)||c==EOF||c==0){
  55.                                 str--;ungetc(c,in);
  56.                                 if(i==1) return(n);
  57.                             }
  58.                             *str=0;n++;
  59.                             break;
  60.                 case 'i':
  61.                             c=getc(in);
  62.                             if(c!='0'){
  63.                                 ungetc(c,in);
  64.                             }else{
  65.                                 flags|=16;  /*  unsigned    */
  66.                                 base=8;max--;
  67.                                 c=getc(in);
  68.                                 if(c!='x'&&c!='X') ungetc(c,in);
  69.                                  else {max--;base=16;}
  70.                             }
  71.                 case 'u':
  72.                             if(!base) {base=10; flags|=16;}
  73.                 case 'x':
  74.                 case 'X':
  75.                             if(!base) {base=16; flags|=16;}
  76.                 case 'o':
  77.                             if(!base) {base=8; flags|=16;}
  78.                 case 'd':
  79.                             if(!base) base=10;
  80.                             if(flags&2) sp=va_arg(vl,short *);
  81.                             else{
  82.                                 if(flags&4) lp=va_arg(vl,long *);
  83.                                  else ip=va_arg(vl,int *);
  84.                             }
  85.                             val=0;
  86.                             c=getc(in);i=0;
  87.                             if(!(flags&16)&&c=='-'){max--;s=1;}else ungetc(c,in);
  88.                             while(1){
  89.                                 int digit=-1;
  90.                                 c=getc(in);
  91.                                 if(c>='0'&&c<='9') digit=c-'0';
  92.                                 if(c>='a'&&c<='f') digit=c-'a'+10;
  93.                                 if(c>='A'&&c<='F') digit=c-'A'+10;
  94.                                 if(digit<0||digit>(base-1)) {ungetc(c,in);break;}
  95.                                 val=val*base+digit;i++;
  96.                                 if(i>=max) break;
  97.                             }
  98.                             if(!i) return(n);
  99.                             if(flags&2){*sp=val;if(s) *sp=-*sp;}
  100.                             else{
  101.                                 if(flags&4){*lp=val;if(s) *lp=-*lp;}
  102.                                  else {*ip=val; if(s) *ip=-*ip;}
  103.                             }
  104.                             n++;
  105.                             break;
  106.             }
  107.         }else{
  108.             int c;
  109.             if(!isspace(k)){
  110.                 c=getc(in);
  111.                 if(c!=k) {ungetc(c,in);return(n);}
  112.             }
  113.             fmt++;
  114.         }
  115.     }
  116.     return(n);
  117. }
  118.